#include<bits/stdc++.h>
#include"graph.h"
using namespace std;
const int N=210;
int d,cnt=1,deg[N],dep[N],dis[N][N],st[N],cntt=-1,ans[N];
vector<pair<int,int> >v[N],g[N];
void dfs(int u){
	int las=LastRoad(),now;
	deg[u]=NumberOfRoads();
	for(int i=1;i<=deg[u];i++){
		if(i!=las){
			Move(i,2);
			now=LastRoad();
			if(Color()==2){
				g[u].push_back({i,0});
				Move(now,2);
				continue;
			}
			v[u].push_back({i,++cnt});
			dis[u][cnt]=dis[cnt][u]=1;
			dep[cnt]=dep[u]+1;
			dfs(cnt);
			Move(now,2);
		}
	}
}
void dfs1(int u){
	int las;
	for(auto i:v[u]){
		Move(i.first,(dep[u]/d)%3+1);
		las=LastRoad();
		dfs1(i.second);
		Move(las,Color());
	}
	for(auto &i:g[u]){
		Move(i.first,(dep[u]/d)%3+1);
		las=LastRoad();
		i.second+=d*(Color()-1);
		Move(las,Color());
	}
}
void dfs2(int u){
	st[++cntt]=u;
	for(auto i:g[u]){
		if(i.second<dep[u]){
			dis[u][st[i.second]]=dis[st[i.second]][u]=1;
		}
	}
	for(auto i:v[u]){
		dfs2(i.second);
	}
	cntt--;
}
void Inspect(int lim){
	memset(dis,127,sizeof(dis));
	dfs(1);
	for(d=1;d<=81;d*=3){
		dfs1(1);
	}
	dfs2(1);
	for(int k=1;k<=cnt;k++){
		for(int i=1;i<=cnt;i++){
			for(int j=1;j<=cnt;j++){
				dis[i][j]=min(0ll+dis[i][j],0ll+dis[i][k]+dis[k][j]);
			}
		}
	}
	for(int i=1;i<=cnt;i++){
		for(int j=i+1;j<=cnt;j++){
			if(dis[i][j]<=lim){
				ans[dis[i][j]]++;
			}
		}
	}
	for(int i=1;i<=lim;i++){
		Answer(i,ans[i]);
	}
}